__author__ = 'FutureAdmin'


class Person:

    """
        这是一个很长的例子.但是他有助于说明类与对象的变量的本质.这里,population属于Person类,因此是一个类的变量,name变量属于对象因此是对象的变量.


        观察可以发现__init__方法用一个名字来初始化Person实例.在这个方法中,我们让population增加1,这是因为我们增加了一个人,同样可以发现,self.name的值根据每个对象指定.这表明了他作为对象的变量的本质.

        记住,你只能使用self变量来参考同一个对象的变量和方法,这被称为属性参考.

        在这个程序中,我们还看到docstring对于类和方法同样有用,我们可以在运行时使用Person.__doc__和Person.sayHi.__doc__来分别访问类与方法的文档字符串.

        就如同__init__方法一样,还有一个特殊的方法__del__,他在对象消失的时候被调用,对象消逝即对象不再被调用.他所占用的内存将返回给系统做他用,在这个方法里面,我们只是简单的把Person.population减一.

        当对象不再被使用时,__del__方法运行,但是很难保证这个方法究竟在什么时候运行,如果你想要指明他的运行,你就得使用del语句,就如同我们在以前的例子中使用的那样.

        Python中所有的类成员都是公共的,所有的方法都是有效的.
        只有一个例外,如果你使用的数据成员名称以双下划线前缀比如__privatevar,Python的名称管理体系会有效的把他作为私有变量.
        这样就有一个惯例,如果某个变量只想在类或者对象中使用,就应该以单下划线前缀,而其他的名称都将作为公共的,可以被其他的类/对象使用,记住这只是一个惯例,并不是Python所要求的,
        同样,注意__del__方法与destructor的概念类似.

    """
    population = 0

    def __init__(self, name):
        """ Initialized the person's data
        """
        self.name = name
        print("Initializing %s" % self.name)
        Person.population += 1


    def __del__(self):
        print("%s says bye" % self.name)
        Person.population -= 1
        if Person.population == 0:
            print("I'm the last one")
        else:
            print("There are still %d people left." % Person.population)

    def sayHi(self):
        print("Hi, my name is %s" % self.name)

    def howMany(self):
        if Person.population == 1:
            print("Im the only person here")
        else:
            print("We have %d person here" % Person.population)


swaroop = Person("Swaroop")
swaroop.sayHi()
swaroop.howMany()


kalam = Person("AbdulKalam")
kalam.sayHi()
kalam.howMany()

swaroop.sayHi()
swaroop.howMany()